package fr.epsi.planning;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.GridLayout;
import android.widget.TextView;
import com.example.MyLittleHotel.R;
import fr.epsi.BDD.BDD;
import fr.epsi.activities.employe.FicheEmployeActivity;
import fr.epsi.activities.tache.AjouterTacheActivity;
import fr.epsi.activities.tache.FicheTacheActivity;

import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by Florent Baudon on 25/05/2014.
 */
public class Planning extends Activity {

    private GridLayout layout;
    private Calendar cal;
    private int nbSem, spanCol = 4;
    private Date semDeb, semFin;
    private Date[] jours;
    private SimpleDateFormat sdf;
    private Activity mainActivity;

    @Override
    protected void onResume() {
        super.onResume();
        setContentView(R.layout.planninglayout);
        createPlanning();
    }

    public void onCreate(Bundle savedInstanceState) {
        //A utiliser dans des classe internes et anonymes
        mainActivity = this;
        cal = Calendar.getInstance();
        sdf = new SimpleDateFormat("yyyy/MM/dd");
        nbSem = 0;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.planninglayout);

        createPlanning();
    }

    private void createPlanning(){
        //recupération et configuration du gridlayout
        layout = (GridLayout)findViewById(R.id.planningGrid);
        layout.setRowCount(26);
        layout.setColumnCount(29);

        //Calcule les jours de la semaine
        jours = this.joursDeSemaine();

        //create view va creer un textview il prend en parametre le contenu, la couleur, la marge, position (ligne & colonne) et la fusion des casse (ligne & colonne)
        //Label jour de la semaine
        TextView semaineText = this.creertextView("Semaine du "+ sdf.format(jours[0]) +" au " + sdf.format(jours[6]), Color.DKGRAY, 0, 0, 5, 1, 21);
        layout.addView(semaineText);

        //Ajout des boutons pour changer de semaines------------------------------------------------------------------------------------------
        //Bouton "precedent"
        Button semPrec = new Button(this);
        semPrec.setText("Précédente");
        semPrec.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                nbSem--;
                cal = Calendar.getInstance();
                cal.add(GregorianCalendar.WEEK_OF_MONTH, nbSem);
                //reinitialise la vue pour pas que des artefacts subsistent
                setContentView(R.layout.planninglayout);
                createPlanning();
            }
        });
        semPrec.setLayoutParams(new GridLayout.LayoutParams(GridLayout.spec(0, GridLayout.FILL), GridLayout.spec(1, 4, GridLayout.FILL)));
        layout.addView(semPrec);
        //Bouton "suivant"
        //Ajout des boutons pour changer de semaines
        Button semSuiv = new Button(this);
        semSuiv.setText("Suivante");
        semSuiv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                nbSem++;
                cal = Calendar.getInstance();
                cal.add(GregorianCalendar.WEEK_OF_MONTH, nbSem);
                //reinitialise la vue pour pas que des artefacts subsistent
                setContentView(R.layout.planninglayout);
                createPlanning();
            }
        });
        semSuiv.setLayoutParams(new GridLayout.LayoutParams(GridLayout.spec(0, GridLayout.FILL), GridLayout.spec(25, 4, GridLayout.FILL)));
        layout.addView(semSuiv);

        //Bouton ajouter tâche----------------------------------------------------------------------------------------------------------------------------
        Button ajTache = new Button(this);
        ajTache.setText("+");
        final Intent tache = new Intent(this, AjouterTacheActivity.class);
        ajTache.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(tache);
            }
        });
        ajTache.setLayoutParams(new GridLayout.LayoutParams(GridLayout.spec(0, 2, GridLayout.FILL), GridLayout.spec(0, GridLayout.FILL)));
        layout.addView(ajTache);


        //Ajout des text view des jour----------------------------------------------------------------------------------------------------------------------------
        layout.addView(this.creertextView("Dimanche " + sdf.format(jours[0]).substring(5, sdf.format(jours[0]).length()), Color.DKGRAY, 0, 1, 1, 1, spanCol));
        layout.addView(this.creertextView("Lundi " + sdf.format(jours[1]).substring(5, sdf.format(jours[1]).length()),Color.DKGRAY, 0, 1, 5, 1, spanCol));
        layout.addView(this.creertextView("Mardi " + sdf.format(jours[2]).substring(5, sdf.format(jours[2]).length()),Color.DKGRAY, 0, 1, 9, 1, spanCol));
        layout.addView(this.creertextView("Mercredi " + sdf.format(jours[3]).substring(5, sdf.format(jours[3]).length()),Color.DKGRAY, 0, 1, 13, 1, spanCol));
        layout.addView(this.creertextView("Jeudi " + sdf.format(jours[4]).substring(5, sdf.format(jours[4]).length()),Color.DKGRAY, 0, 1, 17, 1, spanCol));
        layout.addView(this.creertextView("Vendredi " + sdf.format(jours[5]).substring(5, sdf.format(jours[5]).length()),Color.DKGRAY, 0, 1, 21, 1, spanCol));
        layout.addView(this.creertextView("Samedi " + sdf.format(jours[6]).substring(5, sdf.format(jours[6]).length()),Color.DKGRAY, 0, 1, 25, 1, spanCol));

        //Creation de la colonne des heures
        int heure = 0;
        for(int i = 2; i<26; i++ ){

            TextView tv;

            if(heure==24)
                heure=0;
            if(heure < 10)
                tv = this.creertextView("0" + heure + "H", Color.DKGRAY, 30, i, 0, 1, 1);
            else
                tv = this.creertextView(heure + "H", Color.DKGRAY, 30, i, 0, 1, 1);

            heure++;

            layout.addView(tv);
        }
        //remplissage du planning
        for(int c=1; c<29; c+=4) {
            for (int l = 2; l < 26; l++) {
                TextView tv =this.creertextView("", Color.GRAY, 100, l, c, 1, spanCol);
                layout.addView(tv);
            }
        }
        this.ajoutTaches();
    }

    private TextView creertextView(String text, int color, int paddingSide, int l, int c, int fusionL, int fusionC){
        TextView tv = new TextView(this);
        tv.setGravity(Gravity.CENTER);
        tv.setPadding(paddingSide, 5, paddingSide, 5);
        tv.setTextSize(15);
        tv.setBackgroundColor(color);
        tv.setText(text);

        GridLayout.LayoutParams params =new GridLayout.LayoutParams(GridLayout.spec(l, fusionL, GridLayout.FILL), GridLayout.spec(c, fusionC, GridLayout.FILL));
        this.creerBordures(params);

        tv.setLayoutParams(params);

        return tv;
    }

    private void creerBordures(GridLayout.LayoutParams p){
        p.bottomMargin=1;
        p.topMargin=1;
        p.leftMargin=1;
        p.rightMargin=1;
    }

    private Date[] joursDeSemaine(){
        Date d[] = new Date[7];
        //ecart permettant de revenir au 1er jour de la semaine
        int ecart = (-cal.get(GregorianCalendar.DAY_OF_WEEK))+1;
        //on utilise cet écart pour faire pointer le calendrier au début de la semaine, le lundi
        cal.add(cal.DAY_OF_MONTH, ecart);
        //avec une boucle for, on fait avancer les jours de la semaine pour récuperer toute les dates
        for(int i=0; i<7; i++){
            d[i]= cal.getTime();
            cal.add(cal.DAY_OF_MONTH, 1);
        }
        cal = Calendar.getInstance();
        return d;
    }

    private void ajoutTaches(){
        //pour convertir les heures
        SimpleDateFormat tempsFormat = new SimpleDateFormat("HH:mm");
        //recupérer les taches sous la forme d'objets
        List<Tache> taches = ConvertiseurTaches.recupererTaches(this);
        double ecart=0;
        for(int i=0; i<jours.length; i++) {
            int nbTaches = 0;

            Iterator<Tache> it = taches.iterator();

            while (it.hasNext()) {
                Tache t = it.next();

                //placement heure
                int heure = Integer.valueOf(t.getHeureDeb().substring(0, 2));


                //Durée
                if (t.getDate().equals(sdf.format(jours[i]))) {
                    nbTaches++;
                    try {
                        Date deb = tempsFormat.parse(t.getHeureDeb());
                        Date fin = tempsFormat.parse(t.getHeureFin());
                        //on calculte l'écart entre les 2 dates en les convertissant en millisecondes
                        ecart = Double.valueOf(fin.getTime() - deb.getTime());

                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    //on converti en heure
                    ecart /= 1000;
                    ecart = ecart / 60;
                    ecart = ecart / 60;
                    //et on arrondi au supérieur
                    ecart = Math.ceil(ecart);

                    int color = Color.WHITE;
                    if(t.getService().equals("Menage"))
                        color = Color.BLUE;
                    if(t.getService().equals("Reception"))
                        color = Color.RED;
                    if(t.getService().equals("Maintenance"))
                        color = Color.GREEN;

                    //on sert de nbTache pour mettre côte à côté les tâches que se passent au même moment
                    final TextView tv = this.creertextView(t.getLabel(), color, 0, heure + 2, (i * 4) + 1 + (nbTaches - 1), (int) ecart, 1);
                    tv.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent i = new Intent(mainActivity, FicheTacheActivity.class);
                            i.putExtra("nomTache", ((TextView)v).getText().toString());
                            startActivity(i);
                        }
                    });
                    layout.addView(tv);
                }
            }
        }
    }
}